﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Chapter11
{
    /// <summary>
    /// 第11章 集合、比较和转换
    /// </summary>
    public class Program
    {
        public static void Main(string[] args)
        {
            #region 01 集合
            /*
             * Collections 名称空间中的几个接口提供了基本的集合功能
             * IEnumerable 迭代集合中的项
             * ICollection 继承于 IEnumerable，获取集合中的项的个数，并能把项复制到一个简单的数组类型中
             * IList 继承于 IEnumerable 和 ICollection，提供集合的项列表，允许访问这些项，并提供基他的一些与项列表相关的基本功能
             * IDictionary 继承于 IEnumerable 和 ICollection，提供通过键值访问项列表
             * 01 使用集合
             * Array类、ArrayList类
             * 02 定义集合
             * 03 索引符
             * 04 给 CardLib 添加 Cards 集合
             * 05 键控集合和 IDictionary 
             * 06 迭代器
             * 07 迭代器和集合
             * 08 深度复制
             * 09 给 CardLib 添加深度复制
             * */
            Code01.Code01.Example01.Demo.Begin();
            Code01.Code02.Demo.Bigin();
            Code01.Code03.Demo.Bigin();
            Code01.Code03.Example02.Demo.Begin();
            Code01.Code05.Demo.Begin();
            Code01.Code06.Demo.Begin();
            Code01.Code06.Example03.Demo.Begin();
            Code01.Code07.Demo.Begin();
            Code01.Code08.Demo.Begin();
            Code01.Code09.CardLib.Demo.Begin();
            #endregion

            #region 02 比较
            /*
             * 01 类型比较
             * 01.01 封箱和拆箱
             * 值类型
             * 引用类型
             * 也可以把值类型封箱到接口类型
             * 封箱是隐式转换的，但拆箱必须显式转换，封箱后可允许在项类型是object的集合中使用值类型，另一个是允许值类型调用object方法
             * 01.02 is 运算符 as 运算符
             * 检查引用对象、值对象或接口变量是否是给定类型，或者是否可以转换、封箱或拆箱为给定类型，如果是，返回真,否则为空
             * 02 值比较
             * 02.01 运算符重载
             * 02.02 给 CardLib 添加运算符重载
             * 03 IComparable 和 IComparer 接口
             * .NET 框架比较对象的标准方式
             * IComparable 比较的对象的类中实现，比较2个对象
             * IComparer 在一个单独的类中实现，比较2个对象
             * 04 对集合排序
             * */
            Code02.Code01.Demo.Begin();
            Code02.Code01.Example04.Demo.Begin();
            Code02.Code02.Snippet01.Demo.Begin();
            Code02.Code02.Snippet02.Demo.Begin();
            Code02.Code02.Snippet03.Demo.Begin();
            Code02.Code02.Snippet05.Demo.Begin();
            Code02.Code02.Snippet06.Demo.Begin();
            Code02.Code02.Snippet10.Demo.Begin();
            Code02.Code02.CardLib.Demo.Begin();
            Code02.Code02.Snippet11.Demo.Begin();
            Code02.Code02.Example05.Demo.Begin();
            #endregion

            #region 03 转换
            /*
             * 01 重载转换运算符
             * 02 as 运算符
             * 检查引用对象、值对象或接口变量是否可以转换、封箱或拆箱为给定类型，如果是，返回该类型对象，否则为空
             * 显示转换、隐式转换
             * */
            Code03.Code01.Demo.Begin();
            Code03.Code02.Demo.Begin();
            #endregion

            #region 04 小结
            #endregion

            #region 05 练习
            /*
             * 详见 Item05 空间
             * */
            #endregion

            #region 06 本章要点
            #endregion
        }
    }
}
